home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dobj / symbol.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-09  |  2.6 KB  |  134 lines

  1. /*
  2.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  3.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  4.  *    DICE-LICENSE.TXT.
  5.  */
  6.  
  7. /*
  8.  *  SYMBOL.C
  9.  *
  10.  */
  11.  
  12. #include "defs.h"
  13.  
  14. List    SymList;
  15. Symbol *SymOffCache;
  16.  
  17. Prototype void sym_init(void);
  18. Prototype void ResetSymbol(void);
  19. Prototype Symbol *AddSymbol(Symbol *sym);
  20. Prototype Symbol *FindSymbolName(char *name);
  21. Prototype Symbol *FindSymbolOffset(long offset, short hunkNo);
  22. Prototype Symbol *FindSymbolNext(Symbol *sym);
  23. Prototype Symbol *FindSymbolPrev(Symbol *sym);
  24.  
  25. void
  26. sym_init(void)
  27. {
  28.     NewList(&SymList);
  29. }
  30.  
  31. void
  32. ResetSymbol(void)
  33. {
  34.     Symbol *s;
  35.  
  36.     if (SymList.lh_Head == NULL)
  37.     cerror(EFATAL, "Software Error, ResetSymbolHash");
  38.  
  39.     while ((s = RemHead(&SymList)) != NULL)
  40.     free(s);
  41.     SymOffCache = NULL;
  42. }
  43.  
  44. Symbol *
  45. AddSymbol(Symbol *sym)
  46. {
  47.     Symbol *s;
  48.  
  49.     if (DDebug)
  50.     printf("AddSymbol type=%d value=%d %s\n", sym->sm_Type, sym->sm_Value, sym->sm_Name);
  51.     if ((s = FindSymbolName(sym->sm_Name)) != NULL) {
  52.     if (s->sm_Type == 1 || s->sm_Type == 2) {
  53.         if (sym->sm_Type == 1 || sym->sm_Type == 2)
  54.         cerror(EWARN, "Duplicate symbol def: %s, hunks %d and %d", s->sm_Name, s->sm_DefHunk, sym->sm_DefHunk);
  55.         free(sym);
  56.         return(s);
  57.     } else {
  58.         Remove((Node *)&s->sm_Node);
  59.         *s = *sym;
  60.     }
  61.     free(sym);
  62.     sym = s;
  63.     }
  64.     if (sym->sm_Type > 2)
  65.     sym->sm_DefHunk = -1;
  66.     for (s = GetTail(&SymList); s; s = GetPred((Node *)&s->sm_Node)) {
  67.     if (s->sm_Value < sym->sm_Value)
  68.         break;
  69.     }
  70.     Insert(&SymList, (Node *)&sym->sm_Node, (Node *)&s->sm_Node);
  71.     return(sym);
  72. }
  73.  
  74. Symbol *
  75. FindSymbolName(char *name)
  76. {
  77.     Symbol *s;
  78.  
  79.     for (s = GetHead(&SymList); s; s = GetSucc((Node *)&s->sm_Node)) {
  80.     if (strcmp(s->sm_Name, name) == 0)
  81.         return(s);
  82.     }
  83.     return(NULL);
  84. }
  85.  
  86. /*
  87.  *  find nearest offset >= offset
  88.  */
  89.  
  90. Symbol *
  91. FindSymbolOffset(long offset, short hunkNo)
  92. {
  93.     Symbol *s = SymOffCache;
  94.  
  95.     if (s == NULL)
  96.     s = GetHead(&SymList);
  97.  
  98.     while (s && s->sm_Value >= offset)
  99.     s = GetPred((Node *)&s->sm_Node);
  100.  
  101.     if (s == NULL)
  102.     s = GetHead(&SymList);
  103.  
  104.     while (s && s->sm_Value < offset)
  105.     s = GetSucc((Node *)&s->sm_Node);
  106.  
  107.     while (s && s->sm_DefHunk != hunkNo)
  108.     s = GetSucc((Node *)&s->sm_Node);
  109.  
  110.     if (s)
  111.     SymOffCache = s;
  112.  
  113.     return(s);
  114. }
  115.  
  116. Symbol *
  117. FindSymbolNext(Symbol *sym)
  118. {
  119.     Symbol *s;
  120.  
  121.     for (s = GetSucc((Node *)&sym->sm_Node); s && s->sm_DefHunk != sym->sm_DefHunk; s = GetSucc((Node *)&s->sm_Node));
  122.     return(s);
  123. }
  124.  
  125. Symbol *
  126. FindSymbolPrev(Symbol *sym)
  127. {
  128.     Symbol *s;
  129.  
  130.     for (s = GetPred((Node *)&sym->sm_Node); s && s->sm_DefHunk != sym->sm_DefHunk; s = GetPred((Node *)&s->sm_Node));
  131.     return(s);
  132. }
  133.  
  134.